home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 120_01 / cb.c < prev    next >
Text File  |  1985-03-09  |  8KB  |  437 lines

  1. /* HEADER: CUG120.03;
  2.    TITLE: C beautifier;
  3.    DATE: 09/28/1981;
  4.    DESCRIPTION: "A pretty-printer for C source code.";
  5.    KEYWORDS: C programming,printing;
  6.    SYSTEM: CP/M;
  7.    FILENAME: CB.C;
  8.    CRC: 595B;
  9.    AUTHORS: William C. Colley,Rick Hollinbeck;
  10.    COMPILERS: BDS C v1.44;
  11. */
  12. /*
  13.     Pretty-printer for C Programs
  14.  
  15.     Swiped from the CIPG's UNIX system and modified to run
  16.         under BDS C by William C. Colley, III
  17.  
  18.     Mods made July 1980
  19.  
  20.     Updated to BDS C, v1.44 by Rick Hollinbeck, 9/28/81
  21.  
  22. To use the program, type the following command line:
  23.  
  24.     A>cb input.fil [output.fil]
  25.  
  26. where input.fil is the file to be pretty-printed and [output.fil] is an
  27. optional output file.  If no output file is specified, the output is sent
  28. to the console.
  29. */
  30.  
  31. #include <a:bdscio.h>
  32.  
  33. int slevel[10];
  34. int clevel;
  35. int spflg[20][10];
  36. int sind[20][10];
  37. int siflev[10];
  38. int sifflg[10];
  39. int iflev;
  40. int ifflg;
  41. int level;
  42. int ind[10];
  43. int eflg;
  44. int paren;
  45. int pflg[10];
  46. char lchar;
  47. char pchar;
  48. int aflg;
  49. int ct;
  50. int stabs[20][10];
  51. int qflg;
  52. char *wif[2];
  53. char *welse[2];
  54. char *wfor[2];
  55. char *wds[3];
  56. int j;
  57. char string[200];
  58. char cc;
  59. int sflg;
  60. int bflg;
  61. int peek;
  62. int tabs;
  63. char lastchar;
  64. char c;
  65.  
  66. /*  Added disk I/O buffers, etc.:  */
  67.  
  68. char inpbuf[BUFSIZ], outbuf[BUFSIZ], *outvect;
  69.  
  70. main(argc,argv)
  71. int argc;
  72. char *argv[];
  73. {
  74.     int k;
  75.  
  76.     /*  Initialize everything here.  */
  77.  
  78.     outvect = 1;
  79.     if (argc < 2 || argc > 3){
  80.         printf("Usage:  A>cb input.fil [output.fil]\n");
  81.         exit();
  82.     }
  83.     if (fopen(*++argv,inpbuf) == ERROR){
  84.         printf("File not found: %s\n",*argv);
  85.         exit();
  86.     }
  87.     if (argc == 3){
  88.         if (fcreat(*++argv,outbuf) == ERROR){
  89.             printf("Could not create output file\n");
  90.             exit();
  91.         }
  92.         outvect = outbuf;
  93.     }
  94.     clevel = iflev = level = eflg = paren = 0;
  95.     aflg = qflg = j = bflg = tabs = 0;
  96.     ifflg = peek = -1;
  97.     sflg = 1;
  98.     initw(ind,"0,0,0,0,0,0,0,0,0,0");
  99.     initw(pflg,"0,0,0,0,0,0,0,0,0,0");
  100.     wif[0] = "if";
  101.     welse[0] = "else";
  102.     wfor[0] = "for";
  103.     wds[0] = "case";
  104.     wds[1] = "default";
  105.     wif[1] = welse[1] = wfor[1] = wds[2] = 0;
  106.  
  107.     /*  End of initialization.  */
  108.  
  109.     while((c = getchr()) != 032){
  110.         switch(c){
  111.         default:
  112.             string[j++] = c;
  113.             if(c != ',')lchar = c;
  114.             break;
  115.         case ' ':
  116.         case '\t':
  117.             if(lookup(welse) == 1){
  118.                 gotelse();
  119.                 if(sflg == 0 || j > 0)string[j++] = c;
  120.                 puts();
  121.                 sflg = 0;
  122.                 break;
  123.             }
  124.             if(sflg == 0 || j > 0)string[j++] = c;
  125.             break;
  126.         case '\n':
  127.             if(eflg = lookup(welse) == 1)gotelse();
  128.             puts();
  129.             printf("\n");
  130.             sflg = 1;
  131.             if(eflg == 1){
  132.                 pflg[level]++;
  133.                 tabs++;
  134.             }
  135.             else
  136.                 if(pchar == lchar)
  137.                     aflg = 1;
  138.             break;
  139.         case '{':
  140.             if(lookup(welse) == 1)gotelse();
  141.             siflev[clevel] = iflev;
  142.             sifflg[clevel] = ifflg;
  143.             iflev = ifflg = 0;
  144.             clevel++;
  145.             if(sflg == 1 && pflg[level] != 0){
  146.                 pflg[level]--;
  147.                 tabs--;
  148.             }
  149.             string[j++] = c;
  150.             puts();
  151.             getnl();
  152.             puts();
  153.             printf("\n");
  154.             tabs++;
  155.             sflg = 1;
  156.             if(pflg[level] > 0){
  157.                 ind[level] = 1;
  158.                 level++;
  159.                 slevel[level] = clevel;
  160.             }
  161.             break;
  162.         case '}':
  163.             clevel--;
  164.             if((iflev = siflev[clevel]-1) < 0)iflev = 0;
  165.             ifflg = sifflg[clevel];
  166.             puts();
  167.             tabs--;
  168.             ptabs();
  169.             if((peek = getchr()) == ';'){
  170.                 printf("%c;",c);
  171.                 peek = -1;
  172.             }
  173.             else printf("%c",c);
  174.             getnl();
  175.             puts();
  176.             printf("\n");
  177.             sflg = 1;
  178.             if(clevel < slevel[level])if(level > 0)level--;
  179.             if(ind[level] != 0){
  180.                 tabs -= pflg[level];
  181.                 pflg[level] = 0;
  182.                 ind[level] = 0;
  183.             }
  184.             break;
  185.         case '"':
  186.         case '\'':
  187.             string[j++] = c;
  188.             while((cc = getchr()) != c){
  189.                 string[j++] = cc;
  190.                 if(cc == '\\'){
  191.                     string[j++] = getchr();
  192.                 }
  193.                 if(cc == '\n'){
  194.                     puts();
  195.                     sflg = 1;
  196.                 }
  197.             }
  198.             string[j++] = cc;
  199.             if(getnl() == 1){
  200.                 lchar = cc;
  201.                 peek = '\n';
  202.             }
  203.             break;
  204.         case ';':
  205.             string[j++] = c;
  206.             puts();
  207.             if(pflg[level] > 0 && ind[level] == 0){
  208.                 tabs -= pflg[level];
  209.                 pflg[level] = 0;
  210.             }
  211.             getnl();
  212.             puts();
  213.             printf("\n");
  214.             sflg = 1;
  215.             if(iflev > 0)
  216.                 if(ifflg == 1){iflev--;
  217.                     ifflg = 0;
  218.                 }
  219.                 else iflev = 0;
  220.             break;
  221.         case '\\':
  222.             string[j++] = c;
  223.             string[j++] = getchr();
  224.             break;
  225.         case '?':
  226.             qflg = 1;
  227.             string[j++] = c;
  228.             break;
  229.         case ':':
  230.             string[j++] = c;
  231.             if(qflg == 1){
  232.                 qflg = 0;
  233.                 break;
  234.             }
  235.             if(lookup(wds) == 0){
  236.                 sflg = 0;
  237.                 puts();
  238.             }
  239.             else{
  240.                 tabs--;
  241.                 puts();
  242.                 tabs++;
  243.             }
  244.             if((peek = getchr()) == ';'){
  245.                 printf(";");
  246.                 peek = -1;
  247.             }
  248.             getnl();
  249.             puts();
  250.             printf("\n");
  251.             sflg = 1;
  252.             break;
  253.         case '/':
  254.             string[j++] = c;
  255.             if((peek = getchr()) != '*')break;
  256.             string[j++] = peek;
  257.             peek = -1;
  258.             comment();
  259.             break;
  260.         case ')':
  261.             paren--;
  262.             string[j++] = c;
  263.             puts();
  264.             if(getnl() == 1){
  265.                 peek = '\n';
  266.                 if(paren != 0)aflg = 1;
  267.                 else if(tabs > 0){
  268.                     pflg[level]++;
  269.                     tabs++;
  270.                     ind[level] = 0;
  271.                 }
  272.             }
  273.             break;
  274.         case '#':
  275.             string[j++] = c;
  276.             while((cc = getchr()) != '\n')string[j++] = cc;
  277.             string[j++] = cc;
  278.             sflg = 0;
  279.             puts();
  280.             sflg = 1;
  281.             break;
  282.         case '(':
  283.             string[j++] = c;
  284.             paren++;
  285.             if(lookup(wfor) == 1){
  286.                 while((c = gets()) != ';');
  287.                 ct=0;
  288. cont:
  289.                 while((c = gets()) != ')'){
  290.                     if(c == '(') ct++;
  291.                 }
  292.                 if(ct != 0){
  293.                     ct--;
  294.                     goto cont;
  295.                 }
  296.                 paren--;
  297.                 puts();
  298.                 if(getnl() == 1){
  299.                     peek = '\n';
  300.                     pflg[level]++;
  301.                     tabs++;
  302.                     ind[level] = 0;
  303.                 }
  304.                 break;
  305.             }
  306.             if(lookup(wif) == 1){
  307.                 puts();
  308.                 stabs[clevel][iflev] = tabs;
  309.                 spflg[clevel][iflev] = pflg[level];
  310.                 sind[clevel][iflev] = ind[level];
  311.                 iflev++;
  312.                 ifflg = 1;
  313.             }
  314.         }
  315.     }
  316.     if (outvect != 1){
  317.         printf("\032");
  318.         fflush(outbuf);
  319.     }
  320.     exit();
  321. }
  322. ptabs(){
  323.     int i;
  324.     for(i=0; i < tabs; i++)printf("\t");
  325. }
  326. getchr(){
  327.     if(peek < 0 && lastchar != ' ' && lastchar != '\t')pchar = lastchar;
  328.     lastchar = (peek<0) ? getc(inpbuf):peek;
  329.     peek = -1;
  330.     return(lastchar == '\r' ? getchr():lastchar);
  331. }
  332. puts(){
  333.     if(j > 0){
  334.         if(sflg != 0){
  335.             ptabs();
  336.             sflg = 0;
  337.             if(aflg == 1){
  338.                 aflg = 0;
  339.                 if(tabs > 0)printf("    ");
  340.             }
  341.         }
  342.         string[j] = '\0';
  343.         printf("%s",string);
  344.         j = 0;
  345.     }
  346.     else{
  347.         if(sflg != 0){
  348.             sflg = 0;
  349.             aflg = 0;
  350.         }
  351.     }
  352. }
  353. lookup(tab)
  354. char *tab[];
  355. {
  356.     char r;
  357.     int l,kk,k,i;
  358.     if(j < 1)return(0);
  359.     kk=0;
  360.     while(string[kk] == ' ')kk++;
  361.     for(i=0; tab[i] != 0; i++){
  362.         l=0;
  363.         for(k=kk;(r = tab[i][l++]) == string[k] && r != '\0';k++);
  364.         if(r == '\0' && (string[k] < 'a' || string[k] > 'z'))return(1);
  365.     }
  366.     return(0);
  367. }
  368. gets(){
  369.     char ch;
  370. beg:
  371.     if((ch = string[j++] = getchr()) == '\\'){
  372.         string[j++] = getchr();
  373.         goto beg;
  374.     }
  375.     if(ch == '\'' || ch == '"'){
  376.         while((cc = string[j++] = getchr()) != ch)if(cc == '\\')string[j++] = getchr();
  377.         goto beg;
  378.     }
  379.     if(ch == '\n'){
  380.         puts();
  381.         aflg = 1;
  382.         goto beg;
  383.     }
  384.     else return(ch);
  385. }
  386. gotelse(){
  387.     tabs = stabs[clevel][iflev];
  388.     pflg[level] = spflg[clevel][iflev];
  389.     ind[level] = sind[clevel][iflev];
  390.     ifflg = 1;
  391. }
  392. getnl(){
  393.     while((peek = getchr()) == '\t' || peek == ' '){
  394.         string[j++] = peek;
  395.         peek = -1;
  396.     }
  397.     if((peek = getchr()) == '/'){
  398.         peek = -1;
  399.         if((peek = getchr()) == '*'){
  400.             string[j++] = '/';
  401.             string[j++] = '*';
  402.             peek = -1;
  403.             comment();
  404.         }
  405.         else string[j++] = '/';
  406.     }
  407.     if((peek = getchr()) == '\n'){
  408.         peek = -1;
  409.         return(1);
  410.     }
  411.     return(0);
  412. }
  413. comment(){
  414. rep:
  415.     while((c = string[j++] = getchr()) != '*')
  416.         if(c == '\n'){
  417.             puts();
  418.             sflg = 1;
  419.         }
  420. gotstar:
  421.     if((c = string[j++] = getchr()) != '/'){
  422.         if(c == '*')goto gotstar;
  423.         goto rep;
  424.     }
  425. }
  426. printf(format,arg)
  427. char *format;
  428. unsigned arg;
  429. {
  430.     if (fprintf(outvect,format,arg) == ERROR){
  431.         fprintf(1,"Disk write error\n");
  432.         exit();
  433.     }
  434. }
  435. f);
  436.     }
  437.     exit();